#define _CRT_SECURE_NO_WARNINGS 1

#include <iostream>
#include "Date.h"

using namespace std;

void Date::print()
{
	cout << _year << '/' << _month << '/' << _day << endl;
}

// d1 + 100
Date& Date::operator+=(int day)
{
	_day += day;
	while (_day > GetMonthDay(_year, _month))
	{
		_day -= GetMonthDay(_year, _month);
		_month++;

		if (_month == 13)
		{
			_year++;
			_month = 1;
		}
	}

	return *this;
}

Date Date::operator+(int day)
{
	Date tmp = *this;

	tmp += day;
	return tmp;
}

Date& Date::operator-=(int day)
{
	_day -= day;

	while (_day < 1)
	{
		_month--;
		if (_month < 1)
		{
			_year -= 1;
			_month = 12;
		}
		_day += GetMonthDay(_year, _month);

	}

	return *this;
}

Date Date::operator-(int day)
{
	Date tmp = *this;
	tmp -= day;
	return tmp;
}

bool Date::operator<(const Date& d)
{
	if (_year < d._year)
	{
		return true;
	}
	else if (_year == d._year 
		&& _month < d._month)
	{
		return true;
	}
	else if (_year == d._year
		&& _month == d._month
		&& _day < d._day)
	{
		return true;
	}
	else
	{
		return false;
	}
}

bool Date::operator==(const Date& d)
{
	return _year == d._year
		&& _month == d._month
		&& _day == d._day;
}

Date& Date::operator=(const Date& d)
{
	this->_year = d._year;
	this->_month = d._month;
	this->_day = d._day;

	return *this;
}

int Date::operator-(const Date& d)
{
	Date d1 = *this;
	Date d2 = d;

	if (d1 < d2)
	{
		Date tmp = d1;
		d1 = d2;
		d2 = tmp;
	}

	int cnt = d1._day;
	d1._month--;
	while (d1._month > 0)
	{
		cnt += GetMonthDay(d1._year, d1._month);
		d1._month--;
	}

	cnt += d2.GetMonthDay(d2._year, d2._month) - d2._day;
	d2._month++;
	while (d2._month <= 12)
	{
		cnt += d2.GetMonthDay(d2._year, d2._month);
		d2._month++;
	}

	int tmp = d2._year + 1;

	while (tmp < d1._year)
	{
		if ((tmp % 4 == 0 && tmp % 100 != 0) || tmp % 400 == 0)
		{
			cnt += 366;
			tmp++;
		}
		else
		{
			cnt += 365;
			tmp++;
		}
	}

	return cnt;
}